#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <ctype.h>
#include <unistd.h> // 系统调用接口所需头文件
#include <string.h> // strlen所需头文件
#include <sys/types.h> 
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>


#define MAX_LENGTH 1024 // 设置缓冲区的最大长度
#define ENTER_REDIRECT 0 // 输入重定向 标记为0
#define OUTPUT_REDIRECT 1 // 输出重定向 标记为1
#define APPEND_REDIRECT 2 // 追加重定向 标记为2
#define REDPID_DEFAULT 666 // 默认的重定向标记符 只要不是0 1 2 都行
char hostname[MAX_LENGTH]; // 存储主机名的字符数组
char pwd[MAX_LENGTH]; // 存储当前工作路径的字符数组
char command[MAX_LENGTH]; // 存储命令行参数
char* argv[MAX_LENGTH]; // 存储分割后的命令行参数
extern char** environ;
int exitNum; // 子进程的退出码
char* myenv[MAX_LENGTH]; // 存储用户自定义的环境变量
int myenvPos = 0; // 维护myenv数组
char* redirectname = NULL; // 记录重定向的文件名称
int redpid = REDPID_DEFAULT; // 标记是输入重定向 0 | 输出重定向 1 | 追加重定向 3 


int main()
{
    int hostnameRes = gethostname(hostname, MAX_LENGTH);
    // 检查gethostname函数的返回值
    if (hostnameRes == -1)
    {
        perror("gethostname");
    }



    char* cwdRes = getcwd(pwd, MAX_LENGTH);
    // 检查getcwd函数的返回值
    if (cwdRes == NULL)
    {
        perror("getcwd");
    }
    

    
    while(1)
    {
        printf("[%s@%s %s]$ ", getlogin(),hostname, pwd);
   		char* fgetsRes = fgets(command, sizeof(command), stdin);
    	// 验证fgets函数的返回值
    	if (fgetsRes == NULL)
    	{
        	perror("fgets");
    	}




        // 将读取到的回车置为'\0'
        // 注意：strlen将'\n'也算进去了，遇到'\0'就停止
        size_t realSize = strlen(command);
        command[realSize - 1] = '\0';
       

        // 分割命令行参数
        int i = 0;
        // echo "hello world" > log.txt
        argv[i++] = strtok(command, " ");  // 第一次调用，传入待分割的字符串
        while (argv[i++] = strtok(NULL, " ")); // 后续调用，第一个参数传入 NULLL
        int argc = i - 1;
        if (argc == 0)
        {
            // 用户一个字符都没输入的情况
            continue;
        }

         int k=0;
        for(;argv[k];k++)
        {
            printf("argv[%d]: %s\n",k,argv[k]);
        }
    }
    return 0;
}

